#ifndef SINGLETON_H
#define SINGLETON_H

/******************************************************************************
 *
 * @file       singleton.h
 * @brief      网络请求类要做成一个单例类，这样方便在任何需要发送http请求的时候调用
 *
 * @author     ax
 * @date       2024/05/10
 * @history
 *****************************************************************************/

#include <iostream>
#include <memory>
#include <mutex>
#include "global.h"

using namespace std;

template<class K>
class Singleton{
protected:
// public:
    Singleton() = default;
    Singleton(const Singleton<K>&) = delete;
    Singleton& operator=(const Singleton<K>& singleton) = delete;

    static std::shared_ptr<K> _instance; // 静态成员变量得在类外初始化的哦，属于这个类对象共有
public:
    // 这个单例类写的不一样唉，第一次见
    static std::shared_ptr<K> GetInstance(){
        static std::once_flag s_flag;
        std::call_once(s_flag, [&](){
            _instance = std::shared_ptr<K>(new K);
        });
        return _instance;
    }
    void PrintAddress(){
        std::cout << _instance.get() << std::endl;
    }
    ~Singleton(){
        std::cout << "this is singleton destruct" << std::endl;
    }
};

// static 成员变量初始化
template<class K>
std::shared_ptr<K> Singleton<K>::_instance = nullptr;


#endif // SINGLETON_H
